package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Spring核心框架，是一个Bean容器。帮我们管理项目中使用到的类。
 */
public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //需求:使用到Person类的sayHello方法
        /*
            1:硬编码，自己new，然后调用方法
            优点:性能好，简单
            缺点:耦合高(代码写死了，只能使用Person。后期想更换其他类这里Demo要跟着修改)
                提高维护成本
         */
        Person p = new Person();
        p.sayHello();
        /*
            2:反射机制
            优点:解耦合，代码灵活
            缺点:性能低，代码复杂，编写复杂的反射代码
         */
        Class cls = Class.forName( "demo1.Person");
        Person p2 = (Person)cls.newInstance();
        p2.sayHello();

        /*
            3:使用Spring容器
            使用容器后，有一个模式发生了改变，就是当我们需要使用到一个类的实例时，从
            原本我们主动实例化(无论是硬编码还是反射)现在转变为向容器"要"对象使用。

            这种转变:
            原来，我们使用谁，实例化谁这个操作的控制代码由我们自己编写。
            现在转变为向容器要，这意味着对象的实例化(对象的初始化)的控制由容器来完成。
            这就是 IoC(控制反转)。
         */
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext("demo1");
        Person p3 = context.getBean(Person.class);
        p3.sayHello();
    }
}




